home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / GUSI / Examples / GUSIUnixTest.c < prev    next >
C/C++ Source or Header  |  1993-07-18  |  3KB  |  148 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIUnixTest    -    Test unix domain sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Started    :    12Apr92                                Language    :    MPW C
  6.                 17Apr92    MN    Handle SIOW activate/update
  7.                 25Jul92    MN    Adapt to new testing gear & implementation
  8.                 26Jul92    MN    Fixed a few minor bugs
  9.                 08Sep92    MN    Factor out more common code
  10. Last        :    08Sep92
  11. *********************************************************************/
  12.  
  13. #include <GUSI.h>
  14. #include <GUSITest.h>
  15. #include <stdio.h>
  16. #include <fcntl.h>
  17. #include <stdlib.h>
  18. #include <errno.h>
  19. #include <string.h>
  20.  
  21. #include "Events.h"
  22.  
  23. extern int GUSIDefaultSpin(spin_msg, long);
  24.  
  25. void Socket(char ch1, char, const char *)
  26. {
  27.     sock    =    socket(AF_UNIX, (ch1 == 's') ? SOCK_STREAM : SOCK_DGRAM, 0);
  28.     
  29.     if (sock == -1)    {
  30.         printf("# socket() returned error %s\n", Explain());
  31.         Where();
  32.     }
  33. }
  34.  
  35. void Bind(char, char, const char * cmd)
  36. {
  37.     int                        len;
  38.     struct sockaddr_un    addr;
  39.  
  40.     if (sock == -1)    {
  41.         printf("# socket is not open\n");
  42.         Where();
  43.         
  44.         return;
  45.     }
  46.  
  47.     if (sscanf(cmd, "%s", addr.sun_path) == 1) {
  48.         addr.sun_family    =    AF_UNIX;
  49.         len                    =    strlen(addr.sun_path)+2;
  50.     } else {
  51.         len = sizeof(struct sockaddr_un);
  52.         
  53.         if (choose(AF_UNIX, 0, "", nil, CHOOSE_NEW, &addr, &len))    {
  54.             printf("# choose() returned error %s\n", Explain());
  55.             Where();
  56.             
  57.             return;
  58.         }
  59.     }
  60.  
  61.     if (bind(sock, (struct sockaddr *) &addr, len))    {
  62.         printf("bind(\"%s\") returned error %s\n", addr.sun_path, Explain());
  63.         Where();
  64.     }
  65. }
  66.  
  67. void Accept(char, char, const char *)
  68. {
  69.     int                        len;
  70.     struct sockaddr_un    addr;
  71.  
  72.     if (sock == -1)    {
  73.         printf("# socket is not open\n");
  74.         Where();
  75.         
  76.         return;
  77.     }
  78.     if (accsock != -1)    {
  79.         printf("# can't accept more than one connection\n");
  80.         Where();
  81.         
  82.         return;
  83.     }
  84.  
  85.     len    =    sizeof(struct sockaddr_un);
  86.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  87.     
  88.     if (sock < 0)    {
  89.         printf("# accept() returned error %s\n", Explain());
  90.         sock        =    accsock;
  91.         accsock    =    -1;
  92.     } else {
  93.         addr.sun_path[len-2]    = 0;
  94.         
  95.         printf("# accepted connection from \"%s\"\n", addr.sun_path);
  96.     }
  97.     
  98.     Where();
  99. }
  100.     
  101. void Connect(char, char, const char * cmd)
  102. {
  103.     int                        len;
  104.     struct sockaddr_un    addr;
  105.  
  106.     if (sock == -1)    {
  107.         printf("# socket is not open\n");
  108.         Where();
  109.         
  110.         return;
  111.     }
  112.     
  113.     if (sscanf(cmd, "%s", addr.sun_path) == 1) {
  114.         addr.sun_family    =    AF_UNIX;
  115.         len                    =    strlen(addr.sun_path)+2;
  116.     } else {
  117.         len = sizeof(struct sockaddr_un);
  118.         
  119.         if (choose(AF_UNIX, 0, "", nil, 0, &addr, &len))    {
  120.             printf("# choose() returned error %s\n", Explain());
  121.             Where();
  122.             
  123.             return;
  124.         }
  125.     }
  126.  
  127.     if (connect(sock, (struct sockaddr *) &addr, len))    {
  128.         printf("connect(\"%s\") returned error %s\n", addr.sun_path, Explain());
  129.         Where();
  130.     }
  131. }    
  132.  
  133. main(int argc, char ** argv)
  134. {
  135.     printf("GUSIUnixTest        MN 08Sep92\n\n");
  136.  
  137.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  138.     COMMAND('d', 's', Socket,  "",                 "Create a datagram socket");
  139.     COMMAND('b', 'd', Bind,      "[filename]",     "Bind to address");
  140.     COMMAND('c', 'o', Connect, "[filename]",     "Connect to address");
  141.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  142.     
  143.     AddSocketCommands();
  144.     
  145.     GUSISetEvents(GUSISIOWEvents);
  146.     RunTest(argc, argv);
  147.     CleanupSockets();
  148. }